#define _gnu_source
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    //char* const argv[] = {
    //    (char* const)"./code",
    //    (char* const)"-a",
    //    (char* const)"-l",
    //    NULL
    //};
    char* const argv[] = {
        (char* const)"./code",
        (char* const)"-a",
        (char* const)"-b",
        (char* const)"-c",
        NULL
    };
    char* const env[] = {
        (char* const)"I=LXB",
        (char* const)"MYVAL=666",
        NULL
    };
    //extern char** environ;
    //execvpe("ls",argv, environ);
    //int execvpe(const char* file, char* const argv[], char* const envp[]);
    execvpe("./test",argv,env);

    //char* const argv[] = {
    //    (char* const)"ls",
    //    (char* const)"-a",
    //    (char* const)"-l"
    //};

    //execvp("ls",argv);

    //execv("/usr/bin/ls",argv);

    //extern char** environ;
    //execle("./test","./test",NULL, environ);

    //execlp("ps","ps","-a","-l",NULL);

    //execl("./test","./test","-a","-b","-c",NULL);
    
    //printf("replace begin\n");
    //execl("/usr/bin/ls","ls","-a","-l",NULL);
    //printf("replace end\n");
    
    //printf("进程切换 begin\n");
    //execl("/usr/bin/ls","ls","-a","-l",NULL);
    //printf("进程切换 end\n");
    return 0;
}

//int main()
//{
//    int id = fork();
//    if(id == 0){
//        printf("子进程, pid : %d, ppid : %d\n",getpid(),getppid());
//        exit(1);
//    }
//    int status = 0;
//    pid_t rid = wait(&status);
//    if(WIFEXITED(status)){
//        //进程正常退出
//        printf("wait succes,rid : %d, exit code : %d\n",rid,WEXITSTATUS(status));
//    }
//    else{
//        //进程异常退出
//        printf("status exit signal : %d\n",WTERMSIG(status));
//    }
//    //printf("child status : %d\n",status);
//    //printf("status exit code : %d\n",(status >> 8)& 0xFF);
//    //printf("status exit signal : %d\n",status & 0x7F);
//
//    //waitpid(-1,&status,0);
//    //int id = fork();
//    //if(id == 0){
//    //    printf("子进程, pid : %d, ppid : %d\n",getpid(),getppid());
//    //    exit(1);
//    //}
//    //int status = 0;
//    //wait(&status);
//    ////waitpid(-1,&status,0);
//    //printf("child status : %d\n",status);
//    return 0;
//    //int id = fork();
//    //if(id == 0){
//    //    //子进程
//    //    int cnt = 3;
//    //    while(cnt--){
//    //        printf("子进程, pid : %d, ppid : %d\n",getpid(),getppid());
//    //        sleep(1);
//    //    }
//    //    exit(1);
//    //}
//    ////父进程
//    //printf("wait begin\n");
//    //while(waitpid(-1,NULL,WNOHANG) == 0)
//    //{
//    //    printf("父进程: pid : %d\n",getpid());
//    //    //...
//    //    sleep(1);
//    //}
//    //printf("wait end\n");
//    //sleep(10);
//    //int id = fork();
//    //if(id < 0)
//    //{
//    //    perror("fork");
//    //    return -1;
//    //}
//    //else if(id == 0){
//    //    int cnt = 3;
//    //    while(cnt--){
//    //        printf("子进程: pid : %d, ppid : %d\n",getpid(),getppid());
//    //        sleep(1);
//    //    }
//    //    //子进程运行结束后直接退出
//    //    exit(1);
//    //}
//    ////父进程
//    //sleep(5);
//    //wait(NULL);
//    //while(1){}
//    //return 0;
//}
//int main()
//{
//    printf("hello linux");
//    //exit(1);
//    _exit(1);
//    //int id = fork();
//    //int x = 0;
//    //if(id < 0){
//    //    //创建子进程失败
//    //    perror("fork");
//    //    return 1;
//    //}
//    //else if(id == 0){
//    //    //child
//    //    sleep(1);
//    //    printf("子进程, pid : %d, x = %d\n",getpid(),x);
//    //}
//    //else{
//    //    x=100;
//    //    printf("父进程, pid : %d, x = %d\n",getpid(),x);
//    //    sleep(2);
//    //}
//    //return 0;
//    //int id = fork();
//    //if(id < 0){
//    //    //创建子进程失败
//    //    perror("fork");
//    //    return 1;
//    //}
//    //else if(id == 0){
//    //    //child
//    //    printf("子进程, pid : %d\n",getpid());
//    //}
//    //else{
//    //    printf("父进程, pid : %d\n",getpid());
//    //}
//    return 0;
//}
